﻿#ifndef C3POM_KERNEL
#define C3POM_KERNEL
#include<map>
#include<string>
#include<omp.h>
#include"Object.h"
#include"Portal.h"
class Kernel
{
private:
	std::map<std::string,Object> attribute;//属性,对外只读
	std::map<std::string,Object> envar;//环境变量
	std::map<std::string,std::map<std::string,Object> > portals;//portal总表,两层map表嵌套,最外层的string为portal的名字(portal名唯一性),内层string记录动态信息(包括属主,描述,启用时间,类型等等)
	std::map<std::string,std::map<std::string,Object> > plugins;//插件总表,两层map表嵌套,最外层的string是插件的文件名(文件名唯一性),内层string用于记录一些该插件的运行时产生的动态信息.(诸如运行状态,运行时间,是否被依赖等等)
	std::map<std::string,std::map<std::string,Object> > portal_bufs;//portal_buf总表,除了没有保存实例指针外,其他的与上面类似,另外可能会进行引用计数	
	
	omp_lock_t portalmap_lock;//用于锁定portal注册和查找操作---后面换成读写锁
public:
	//构造函数部分
	Kernel(int argc,char** argv);
	
	//portal操作部分
	Portal regportal(std::string,std::map<std::string,Object>);//申请新的portal,传入属主的指针,如果申请成功,将传回一个Portal
	Portal& findportal(std::string);//根据名称查找Portal
	Portal findportal(std::map<std::string,Object>);//查找portal
	void updateportalinfo(Portal);//更新portal
	void delportal();//删除portal
	void updateportalbuflist();//更新portal_buf列表
	void loadportalbuf(std::string);	
	void printallportals();
	
	//envar操作部分
	void setenvar(std::string,Object);//设置/添加新的环境变量
	Object getenvar(std::string);//获取环境变量值
	void delenvar(std::string);//删除环境变量
	//attribute操作部分
	Object getattribute(std::string);//获取属性值

	//
	void run();
	void shell();

	//plugin部分
	void updatepluginlist();//读取插件目录,更新插件总表
	void loadplugin(std::string);//装载插件(初始化)
	void loadallplugin();//装载所有的插件
	void runplugin(std::string);//启动
	void runallplugin();//启动所有的插件
	void hangplugin();//挂起插件
	void wakeplugin();//唤醒插件
	void stopplugin();//终止插件

};

#endif
